


import java.io.File;  
import java.io.FileInputStream;  
import java.io.IOException;  
import java.io.InputStream; 
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;



/**
 * MD5加密工具类
 * 
 * 
 */
public class MD5Util {

	protected static char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6',  
         '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; 
	 
	protected static MessageDigest messagedigest = null;
	
	static {  
        try {  
            messagedigest = MessageDigest.getInstance("MD5");  
        } catch (NoSuchAlgorithmException nsaex) {  
            System.err.println(MD5Util.class.getName()  
                    + "初始化失败，MessageDigest不支持MD5Util。");  
            nsaex.printStackTrace();  
        }  
    }  
	
	public static void main(String[] args) throws IOException {
		String s = "斯蒂芬速度";
		System.out.println(md5(s));
		long begin = System.currentTimeMillis();  
		  
        File file = new File("/home/ltn/log.txt");  
        String md5 = getFileMD5String(file);  
  
//      String md5 = getMD5String("a");  
          
        long end = System.currentTimeMillis();  
        System.out.println("md5:" + md5 + " time:" + ((end - begin) / 1000) + "s");  
	}

	/**
	 * md5加密
	 * 
	 * @param str
	 * @return
	 */
	public static String md5(String str) {
		try {
			MessageDigest md = MessageDigest.getInstance("MD5");
			md.update(str.getBytes());
			byte[] byteDigest = md.digest();
			int i;
			StringBuffer buf = new StringBuffer("");
			for (int offset = 0; offset < byteDigest.length; offset++) {
				i = byteDigest[offset];
				if (i < 0)
					i += 256;
				if (i < 16)
					buf.append("0");
				buf.append(Integer.toHexString(i));
			}
			// 32位加密
			return buf.toString();
			// 16位的加密
			// return buf.toString().substring(8, 24);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
			return null;
		}
	}
	
    public static String getFileMD5String(File file) throws IOException {         
	        InputStream fis;  
	        fis = new FileInputStream(file);  
	        byte[] buffer = new byte[1024];  
	        int numRead = 0;  
	        while ((numRead = fis.read(buffer)) > 0) {  
	            messagedigest.update(buffer, 0, numRead);  
	        }  
	        fis.close();  
	        return bufferToHex(messagedigest.digest());  
	    }
    
    private static String bufferToHex(byte bytes[]) {  
        return bufferToHex(bytes, 0, bytes.length);  
    }  
    
    private static String bufferToHex(byte bytes[], int m, int n) {  
        StringBuffer stringbuffer = new StringBuffer(2 * n);  
        int k = m + n;  
        for (int l = m; l < k; l++) {  
            appendHexPair(bytes[l], stringbuffer);  
        }  
        return stringbuffer.toString();  
    } 
    
    private static void appendHexPair(byte bt, StringBuffer stringbuffer) {  
        char c0 = hexDigits[(bt & 0xf0) >> 4];// 取字节中高 4 位的数字转换, >>> 为逻辑右移，将符号位一起右移,此处未发现两种符号有何不同   
        char c1 = hexDigits[bt & 0xf];// 取字节中低 4 位的数字转换   
        stringbuffer.append(c0);  
        stringbuffer.append(c1);  
    }
  
}
